/*
声明创建通道
var 通道变量 chan 通道类型
通道是引用类型，需要使用 make 进行创建
通道实例 := make(chan 数据类型) // 不带缓冲的chan
通道实例 := make(chan 数据类型,数量) // 带缓冲的chan

ch := make(chan 数据类型)
// 向通道发送数据，通道接收值
ch <- 值
// 从通道接收数据，从通道取出值
<- ch
*/
package main

import "fmt"

type Stu struct {
	Name string
	age  int
}

func main() {
	// 案例1
	ch := make(chan int, 10)
	fmt.Println(len(ch), cap(ch))

	ch <- 1
	ch <- 2
	ch <- 3

	fmt.Println(<-ch) // FIFO
	fmt.Println(<-ch)
	fmt.Println(<-ch)

	// 案例2
	ch2 := make(chan interface{}, 3)
	ch2 <- 100
	ch2 <- "hello"
	ch2 <- Stu{"yuan", 22}

	fmt.Println(<-ch2)
	fmt.Println(<-ch2)
	fmt.Println(<-ch2)
	// s := <-ch2
	//fmt.Println(s.Name)
	// fmt.Println(s.(Stu).Name)

	// 案例3
	ch3 := make(chan int, 3)
	x := 10
	ch3 <- x // 值拷贝
	x = 20
	fmt.Println(<-ch3)

	ch4 := make(chan *int, 3)
	y := 20
	ch4 <- &y
	y = 30
	p := <-ch4
	fmt.Println(*p)
}
